package org.nepu.sc.domain;

import cn.hutool.json.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

@Data
@Slf4j
@ApiModel(value = "通用KV映射")
public class DataVO {
    // 合格 / 不合格 / 泄露 || List
    @ApiModelProperty(example = "数字/合格/不合格/不涉及/List")
    String data;

    @ApiModelProperty(example = "字符/字符list")
    String dataName;

    // 备注
    String remark;

    // 重要性 该指标满分多少分 不涉及重要性就是 0
    @ApiModelProperty(example = "10/5/0")
    Double important;

    // 计分方式
    // 布尔数组: 比例 / 异或               布尔数组默认 异或，
    // 字符串: 合格 / 不合格 / 不涉及       字符串默认 合格，不合格，不涉及
    // 特殊类别： 作业井风险
    @ApiModelProperty(example = "data为列表：比例|异或 data为字符串: 可以忽略 特殊：作业井风险")
    String method;

    public double rate() {
        // 如果是数组，额外判断
        if (JSONUtil.isTypeJSONArray(data)) {
            List<Boolean> dataList = JSONUtil.toList(data, Boolean.class);
            int countT = 0;
            int len = dataList.size();
            for (Boolean b : dataList) {
                if (b) countT++;
            }
            int countF = len - countT;
            if (method.equals("比例")) {
                double ratio = (double) countT / len;
                return ratio * important;
            } else if (method.equals("异或")) {
                if (countF > 0) {
                    return 0.0;
                } else {
                    return important;
                }
            }
        }else if (isNumber(data)){
            try {
                return Double.parseDouble(data);
            } catch (NumberFormatException e) {
                // 处理异常，可能返回默认值或记录日志
                return 0.0;
            }
        }else if (data.equals("合格")) {
            return important;
        } else if (data.equals("不合格")) {
            return 0.0;
        } else if (data.equals("不涉及")) {
            return 0.0;
        }else {
            //data为空或其他
            if (JSONUtil.isTypeJSONArray(dataName)){
                List<String> dataNameList = JSONUtil.toList(dataName, String.class);
                Boolean flag = true;
                for (String dN : dataNameList) {
                    if (dN.equals("无")){
                        flag = false;
                        break;
                    }
                }
                if (flag){
                    return important;
                }else {
                    return 0.0;
                }
            }
        }
        return 0.0;
    }

    // 判断是否为数字
    public static boolean isNumber(String str) {
        if (str == null || str.isEmpty()) {
            return false;
        }
        return str.matches("\\d+");
    }
}

